package com.solution.admin.auth.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.solution.admin.auth.constants.AuthConstants;
import com.solution.admin.auth.dao.UserDao;
import com.solution.admin.auth.entity.UserEntity;
import com.solution.admin.auth.service.UserService;
import com.solution.admin.customer.dao.CompanyDao;
import com.solution.admin.customer.dao.CustomerDao;
import com.solution.admin.customer.entity.CompanyEntity;
import com.solution.admin.customer.entity.CustomerEntity;
import com.solution.admin.point.dao.PointDao;
import com.solution.admin.point.entity.PointEntity;
import com.solution.common.dao.BaseDao;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;
import com.solution.common.service.impl.BaseServiceImpl;
import com.solution.common.utils.string.StringUtil;

/**
 * 用于管理service实现层
 * @author diwankang
 * @date 2017年4月12日 下午2:45:11
 */
@Service
public class UserServiceImpl extends BaseServiceImpl<UserEntity> implements UserService {

    /**
     * 用户权限接口
     */
    @Autowired
    private UserDao userDao;

    @Autowired
    PointDao pointDao;
    
    /**
     * 单位信息接口
     */
    @Autowired
    private CompanyDao companyDao;

    /** 客户接口 */
    @Autowired
    private CustomerDao customerDao;

    protected BaseDao<UserEntity> getDao() {
        return this.userDao;
    }

    /**
     * 
     * @param userCode
     * @return       
     * @author xu_cc  
     * @throws Exception exception
     * @Date 创建时间：2018年4月2日 下午5:03:56
     */
    public UserEntity getUserByCode(String userCode) {
    	return userDao.getUserByCode(userCode);
    }
    /**
     * 保存用户信息
     * 
     * @param userEntity
     *            用户实体
     * @return Long 添加成功用户的ID
     * @author llp
     * @date 2017年4月14日 下午1:40:26
     */
    @Override
    public long saveUser(UserEntity userEntity) {
        // MD5加密
        if (null != userEntity && StringUtil.isNotEmpty(userEntity.getPassword())) {
            // 盐值
            Object salt = UUID.randomUUID();
            Object simpleHash = new SimpleHash("MD5", userEntity.getPassword(), salt.toString(), 1);
            userEntity.setPassword(String.valueOf(simpleHash));
            userEntity.setPasswordSalt(String.valueOf(salt));
        }
        // 添加时间
        userEntity.setCreateTime(new Date());
        return userDao.saveUser(userEntity);
    }

    /**
     * 分页查询用户信息
     * 
     * @param pageParam
     *            分页参数
     * @param paramMap
     *            查询参数
     * @return PageBean 分页参数和分页数据
     * @author llp
     * @date 2017年4月12日 下午2:44:34
     */
    @Override
    public PageBean listUser(PageParam pageParam, Map<String, Object> paramMap) {
        return userDao.listUser(pageParam, paramMap);
    }

    /**
     * 获取登陆者信息
     * 
     * @param params
     * @return
     * @author diwankang
     * @date 2017年4月13日 下午5:21:58
     * @modify <scy> <2017年4月13日 下午5:21:58>
     */
    @Override
    // @Cacheable(value="user_cache",key="'dluser_'+#params['loginName']")
    public UserEntity getUserByName(Map<String, Object> params) {
        return userDao.getUserByName(params);
    }

    /**
     * 根据手机号码查询用户信息
     * 
     * @param params
     * @return UserEntity
     * @author chenl
     * @date 2017年5月9日 上午9:22:03
     */
    public UserEntity getUserInfor(Map<String, Object> params) {
        return userDao.getUserInfor(params);
    }

    /**
     * 用用户信息表的唯一性验证封装类
     * 
     * @param checkDealerId
     *            经销商ID
     * @param checkField
     *            验证字段
     * @param checkValue
     *            验证字段的值
     * @param checkUserId
     *            用户编号
     * @return
     */
    @Override
    public int checkUserUnique(Map<String, Object> params) {
        return userDao.checkUserUnique(params);
    }

    /**
     * 根据ID查询用户信息
     * @param id 用户id
     * @return UserEntity 用户对象
     * @author lilp
     * @date 2017年4月13日 下午5:21:58
     */
    // @Cacheable(value="user_cache",key="'dluser_'+#id")
    public UserEntity getUserById(Long id) {
        return userDao.getById(id.longValue());
    }

    /**
     * 更新用户
     * @param userEntity 用户实体
     * @return Long 更新是否成功，>1代表更新成功
     * @author llp
     * @date 2017年4月12日 下午2:44:59
     */
    @Override
    // @CacheEvict(value="user_cache",key="'dluser_'+#userEntity.id")
    public int updateUser(UserEntity userEntity) {
        return userDao.modifyUser(userEntity);
    }

    /**
     * 重置用户密码
     * 
     * @param id
     *            用户id
     * @param userCode
     *            用户账号
     * @param password
     *            用户新密码
     * @return Long 更新是否成功，>1代表更新成功
     * @author llp
     * @date 2017年4月12日 下午2:44:59
     */
    public int resetUserPwdByMobile(Long id, String userCode, String password, String passwordSalt) {
        UserEntity user = new UserEntity();
        user.setId(id);
        Object simpleHash = new SimpleHash(AuthConstants.SIMPLE_HASH_PARAM.MD5.getName(), password, passwordSalt,
                Integer.valueOf(AuthConstants.SIMPLE_HASH_PARAM.ENCTRY_TIMES.getName()));

        user.setPassword(String.valueOf(simpleHash));
        return userDao.updateUserPwd(user);
    }

    /**
     * 根据手机号码重置用户密码
     * 
     * @param id
     * @param userCode
     * @return
     * @author chenl
     * @date 2017年5月9日 上午9:00:54
     */
    public int resetUserPwd(Long id, String userCode) {
        UserEntity user = userDao.getById(id);
        Object simpleHash = new SimpleHash(AuthConstants.SIMPLE_HASH_PARAM.MD5.getName(), AuthConstants.SIMPLE_HASH_PARAM.DEFAULT_PWD.getName(),
                user.getPasswordSalt(), Integer.valueOf(AuthConstants.SIMPLE_HASH_PARAM.ENCTRY_TIMES.getName()));

        user.setPassword(String.valueOf(simpleHash));
        return userDao.updateUserPwd(user);
    }

    @Override
    public int updateStatus(Long userId, Integer status) {
        return userDao.updateStatus(userId, status);
    }

    /**
     * 修改当前登录人密码
     * 
     * @param user
     * @return
     * @author qiaoenyin
     * @date 2017年6月19日 下午3:56:57
     */
    @Override
    public int updatePwd(UserEntity user) {
        Object salt = UUID.randomUUID();
        Object simpleHash = new SimpleHash(AuthConstants.SIMPLE_HASH_PARAM.MD5.getName(), user.getPassword(), salt.toString(),
                Integer.valueOf(AuthConstants.SIMPLE_HASH_PARAM.ENCTRY_TIMES.getName()));
        user.setPassword(String.valueOf(simpleHash));
        user.setPasswordSalt(String.valueOf(salt));
        return userDao.modifyUser(user);
    }

    /**
     * 根据经销商编码获取经销商大区及公司的名称、编码
     * @param dealerCodes
     * @return
     * @author xkl
     * @date 2017年7月31日 下午3:08:23
     */
    @Override
    public Map<String, Map<String, Object>> listCodeMapByCodes(List<String> dealerCodes) {
        return userDao.listCodeMapByCodes(dealerCodes);
    }

    /**
     * 根据用户类型获取用户信息
     * @param param
     * @return
     * @author chenling
     * @date 2017年8月1日 下午2:53:45
     */
    @Override
    public List<UserEntity> getUserList(Map<String, Object> param) {
        return userDao.getUserList(param);
    }

    /**
     * 设置用户角色
     * 
     * @param userId
     * @param roleIdList
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void assginUserRole(long userId, ArrayList<Long> roleIdList) {
        // 删除用户现在的角色
        userDao.deleteUserRole(userId);
        // 插入新角色
        userDao.insertUserRole(userId, roleIdList);
    }

    /**
     * 用户注册（用户信息，公司信息，客户信息）
     * @Title: regUser
     * @Description:(描述)
     * @param user
     * @param company
     * @param customer
     * @return BaseReturn
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年10月17日 下午8:30:14
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public int regUser(UserEntity user, CompanyEntity company, CustomerEntity customer) throws Exception {
        // 保存用户
        userDao.saveUser(user);
        // 保存公司信息
        if (null != company && null != customer && StringUtil.isNotNull(company.getCompanyName()) && StringUtil.isNotNull(customer.getUserName())) {
            Long companyId = companyDao.saveCompany(company);
            if (null == companyId) {
                throw new Exception("未返回公司ID");
            }
            customer.setCompanyId(companyId);
            // 保存客户信息
            customerDao.saveCustomer(customer);
        }
        return 1;
    }
    
    /**
	 * 获取业务员列表数据
	 * @param params
	 * @return
	 * @author: solin
	 * @date: 2017年10月20日 下午3:57:56
	 */
    @Override
	public List<UserEntity> getSalesmanList(Map<String, Object> param) {
		return userDao.getSalesmanList(param);
	}
    
    
    /**
	 * 查询业务员列表
	 * @param paramMap
	 * @return
	 */
    @Override
	public List<UserEntity> listSalesmanForSelector(Map<String, Object> paramMap){
		return userDao.listSalesmanForSelector(paramMap);
	}

	/**
	 * 逻辑删除用户
	 * @param user
	 * @return
	 */
    @Override
	public int logicDeleteUser(long id){
		return userDao.logicDeleteUser(id);
	}
    
    /**
     * 物理删除用户
     * @param id
     * @return
     */
    @Override
    public int physicsDeleteUser(long id){
    	return userDao.deleteById(id);
    }

}
